{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# EIIE for Portfolio Management on DJ30\n",
    "This tutorial is to demonstrate an example of using EIIE to do portfolio management on DJ30\n",
    "## Set up Experinment Environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting package metadata (current_repodata.json): | ^C\n",
      "failed\n",
      "\n",
      "CondaError: KeyboardInterrupt\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from IPython.display import clear_output\n",
    "import argparse\n",
    "import sys\n",
    "import numpy as np\n",
    "import torch\n",
    "from torch import nn\n",
    "import yaml\n",
    "import os\n",
    "import pandas as pd\n",
    "module_path = os.path.abspath(os.path.join('..'))\n",
    "sys.path.append(module_path)\n",
    "requirements_path=module_path+\"/requirements.txt\"\n",
    "print(requirements_path)\n",
    "command=\"pip install -r \"+requirements_path\n",
    "os.system(command)\n",
    "clear_output(wait=True)\n",
    "! conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch\n",
    "clear_output(wait=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download and Preprocess the Data\n",
    "The dataconfig part in TradeMaster is shared by all other parts, it is worth noticing that for algorithms trading, only the dataset BTC is supported.\n",
    "\n",
    "The following code will help to download the data in the folder [.data/data/dj30](https://github.com/qinmoelei/TradeMaster_reframe/tree/master/tutorial/data/data/dj30), where 4 files could be found: the whole data and train, valid and test data which will be used when we try to construct the RL environment for the agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:19: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  (temp_indicator.close.rolling(2).sum() - temp_indicator.close)) - 1\n",
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:21: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  5) / temp_indicator.adjcp - 1\n",
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:23: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  10) / temp_indicator.adjcp - 1\n",
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:25: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  15) / temp_indicator.adjcp - 1\n",
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:27: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  20) / temp_indicator.adjcp - 1\n",
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:29: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  25) / temp_indicator.adjcp - 1\n",
      "/home/sunshuo/qml/TradeMaster/data/preprocess.py:31: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  30) / temp_indicator.adjcp - 1\n"
     ]
    }
   ],
   "source": [
    "from data.download_data import Dataconfig\n",
    "parser = argparse.ArgumentParser()\n",
    "\n",
    "parser.add_argument(\"--data_path\",\n",
    "                    type=str,\n",
    "                    default=\"./data/data/\",\n",
    "                    help=\"the path for storing the downloaded data\")\n",
    "#where we store the dataset\n",
    "parser.add_argument(\n",
    "    \"--output_config_path\",\n",
    "    type=str,\n",
    "    default=\"./config/output_config/data\",\n",
    "    help=\"the path for storing the generated config file for data\")\n",
    "# where we store the config file\n",
    "parser.add_argument(\n",
    "    \"--dataset\",\n",
    "    choices=[\"exchange\",\"dj30\",\"sz50\",\"crypto\"],\n",
    "    default=\"dj30\",\n",
    "    help=\"the name of the dataset\",\n",
    ")\n",
    "parser.add_argument(\"--split_proportion\",\n",
    "                    type=list,\n",
    "                    default=[0.8, 0.1, 0.1],\n",
    "                    help=\"the split proportion for train, valid and test\")\n",
    "parser.add_argument(\n",
    "    \"--generate_config\",\n",
    "    type=bool,\n",
    "    default=False,\n",
    "    help=\n",
    "    \"determine whether to generate a yaml file to memorize the train valid and test'data's dict\"\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--input_config\",\n",
    "    type=bool,\n",
    "    default=False,\n",
    "    help=\n",
    "    \"determine whether to use a yaml file as the overall input of the Dataconfig, this is needed when have other format of dataset\"\n",
    ")\n",
    "\n",
    "parser.add_argument(\n",
    "    \"--input_config_path\",\n",
    "    type=str,\n",
    "    default=\"config/input_config/data/custom.yml\",\n",
    "    help=\n",
    "    \"determine the location of a yaml file used to initialize the Dataconfig Class\"\n",
    ")\n",
    "args = parser.parse_args(args=[])\n",
    "a = Dataconfig(args)\n",
    "clear_output(wait=True)\n",
    "clear_output(wait=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The preprocessed data follows the following structure:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>adjcp</th>\n",
       "      <th>tic</th>\n",
       "      <th>zopen</th>\n",
       "      <th>zhigh</th>\n",
       "      <th>zlow</th>\n",
       "      <th>zadjcp</th>\n",
       "      <th>zclose</th>\n",
       "      <th>zd_5</th>\n",
       "      <th>zd_10</th>\n",
       "      <th>zd_15</th>\n",
       "      <th>zd_20</th>\n",
       "      <th>zd_25</th>\n",
       "      <th>zd_30</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2012-01-03</td>\n",
       "      <td>14.621429</td>\n",
       "      <td>14.732143</td>\n",
       "      <td>14.607143</td>\n",
       "      <td>14.686786</td>\n",
       "      <td>12.575916</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>-0.004450</td>\n",
       "      <td>0.003088</td>\n",
       "      <td>-0.005423</td>\n",
       "      <td>-0.143726</td>\n",
       "      <td>0.005374</td>\n",
       "      <td>-0.010348</td>\n",
       "      <td>-0.011415</td>\n",
       "      <td>0.002751</td>\n",
       "      <td>-0.061124</td>\n",
       "      <td>-0.072128</td>\n",
       "      <td>-0.126481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2012-01-04</td>\n",
       "      <td>14.642857</td>\n",
       "      <td>14.810000</td>\n",
       "      <td>14.617143</td>\n",
       "      <td>14.765714</td>\n",
       "      <td>12.643501</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>-0.008320</td>\n",
       "      <td>0.002999</td>\n",
       "      <td>-0.010062</td>\n",
       "      <td>-0.143726</td>\n",
       "      <td>0.005374</td>\n",
       "      <td>-0.010348</td>\n",
       "      <td>-0.011415</td>\n",
       "      <td>0.002751</td>\n",
       "      <td>-0.061124</td>\n",
       "      <td>-0.072128</td>\n",
       "      <td>-0.126481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2012-01-05</td>\n",
       "      <td>14.819643</td>\n",
       "      <td>14.948214</td>\n",
       "      <td>14.738214</td>\n",
       "      <td>14.929643</td>\n",
       "      <td>12.783867</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>-0.007368</td>\n",
       "      <td>0.001244</td>\n",
       "      <td>-0.012822</td>\n",
       "      <td>-0.143726</td>\n",
       "      <td>0.011102</td>\n",
       "      <td>-0.010348</td>\n",
       "      <td>-0.011415</td>\n",
       "      <td>0.002751</td>\n",
       "      <td>-0.061124</td>\n",
       "      <td>-0.072128</td>\n",
       "      <td>-0.126481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2012-01-06</td>\n",
       "      <td>14.991786</td>\n",
       "      <td>15.098214</td>\n",
       "      <td>14.972143</td>\n",
       "      <td>15.085714</td>\n",
       "      <td>12.917509</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>-0.006226</td>\n",
       "      <td>0.000829</td>\n",
       "      <td>-0.007528</td>\n",
       "      <td>-0.143726</td>\n",
       "      <td>0.010454</td>\n",
       "      <td>-0.010348</td>\n",
       "      <td>-0.011415</td>\n",
       "      <td>0.002751</td>\n",
       "      <td>-0.061124</td>\n",
       "      <td>-0.072128</td>\n",
       "      <td>-0.126481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2012-01-09</td>\n",
       "      <td>15.196429</td>\n",
       "      <td>15.276786</td>\n",
       "      <td>15.048214</td>\n",
       "      <td>15.061786</td>\n",
       "      <td>12.897021</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>0.008939</td>\n",
       "      <td>0.014275</td>\n",
       "      <td>-0.000901</td>\n",
       "      <td>-0.143726</td>\n",
       "      <td>-0.001586</td>\n",
       "      <td>-0.010348</td>\n",
       "      <td>-0.011415</td>\n",
       "      <td>0.002751</td>\n",
       "      <td>-0.061124</td>\n",
       "      <td>-0.072128</td>\n",
       "      <td>-0.126481</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         date       open       high        low      close      adjcp   tic  \\\n",
       "0  2012-01-03  14.621429  14.732143  14.607143  14.686786  12.575916  AAPL   \n",
       "1  2012-01-04  14.642857  14.810000  14.617143  14.765714  12.643501  AAPL   \n",
       "2  2012-01-05  14.819643  14.948214  14.738214  14.929643  12.783867  AAPL   \n",
       "3  2012-01-06  14.991786  15.098214  14.972143  15.085714  12.917509  AAPL   \n",
       "4  2012-01-09  15.196429  15.276786  15.048214  15.061786  12.897021  AAPL   \n",
       "\n",
       "      zopen     zhigh      zlow    zadjcp    zclose      zd_5     zd_10  \\\n",
       "0 -0.004450  0.003088 -0.005423 -0.143726  0.005374 -0.010348 -0.011415   \n",
       "1 -0.008320  0.002999 -0.010062 -0.143726  0.005374 -0.010348 -0.011415   \n",
       "2 -0.007368  0.001244 -0.012822 -0.143726  0.011102 -0.010348 -0.011415   \n",
       "3 -0.006226  0.000829 -0.007528 -0.143726  0.010454 -0.010348 -0.011415   \n",
       "4  0.008939  0.014275 -0.000901 -0.143726 -0.001586 -0.010348 -0.011415   \n",
       "\n",
       "      zd_15     zd_20     zd_25     zd_30  \n",
       "0  0.002751 -0.061124 -0.072128 -0.126481  \n",
       "1  0.002751 -0.061124 -0.072128 -0.126481  \n",
       "2  0.002751 -0.061124 -0.072128 -0.126481  \n",
       "3  0.002751 -0.061124 -0.072128 -0.126481  \n",
       "4  0.002751 -0.061124 -0.072128 -0.126481  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=pd.read_csv(\"data/data/dj30/dj30.csv\",index_col=0)\n",
    "data.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EIIE Enviornment Construction, Agent Training, Model Picking and Testing\n",
    "For the simplicity, we use the yaml file to store the configuration for the RL environment construction, which can be found [here](https://github.com/qinmoelei/TradeMaster_reframe/tree/master/tutorial/config/input_config/env/PM/portfolio_for_EIIE)\n",
    "but first, let us import the package we might use"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_3842130/4274392043.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     58\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautograd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_detect_anomaly\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     59\u001b[0m     \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m     \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_with_valid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     61\u001b[0m     \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     62\u001b[0m \u001b[0mclear_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/qml/TradeMaster/agent/EIIE/trader.py\u001b[0m in \u001b[0;36mtrain_with_valid\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    189\u001b[0m                 \u001b[0maction\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_numpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    190\u001b[0m                 s, reward, done, _ = self.train_env_instance.step(\n\u001b[0;32m--> 191\u001b[0;31m                     action.detach().numpy())\n\u001b[0m\u001b[1;32m    192\u001b[0m                 self.store_transition(\n\u001b[1;32m    193\u001b[0m                     \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_numpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mold_state\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/qml/TradeMaster/env/PM/portfolio_for_EIIE.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self, weights)\u001b[0m\n\u001b[1;32m    137\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtic\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mtic\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtech\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    138\u001b[0m                 \u001b[0;32mfor\u001b[0m \u001b[0mtech\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtech_indicator_list\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m             ] for tic in self.data.tic.unique()])\n\u001b[0m\u001b[1;32m    140\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    141\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/qml/TradeMaster/env/PM/portfolio_for_EIIE.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    137\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtic\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mtic\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtech\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    138\u001b[0m                 \u001b[0;32mfor\u001b[0m \u001b[0mtech\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtech_indicator_list\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m             ] for tic in self.data.tic.unique()])\n\u001b[0m\u001b[1;32m    140\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    141\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/qml/TradeMaster/env/PM/portfolio_for_EIIE.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    136\u001b[0m             self.state = np.array([[\n\u001b[1;32m    137\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtic\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mtic\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtech\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m                 \u001b[0;32mfor\u001b[0m \u001b[0mtech\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtech_indicator_list\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    139\u001b[0m             ] for tic in self.data.tic.unique()])\n\u001b[1;32m    140\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m   3447\u001b[0m         \u001b[0;31m# Do we have a (boolean) 1d indexer?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3448\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mcom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_bool_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3449\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_bool_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3450\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3451\u001b[0m         \u001b[0;31m# We are left with two options: a single key, and a collection of keys,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_getitem_bool_array\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m   3502\u001b[0m         \u001b[0mkey\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_bool_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3503\u001b[0m         \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnonzero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3504\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_take_with_is_copy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3505\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3506\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m_take_with_is_copy\u001b[0;34m(self, indices, axis)\u001b[0m\n\u001b[1;32m   3626\u001b[0m         \u001b[0mSee\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mdocstring\u001b[0m \u001b[0mof\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;31m`\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfull\u001b[0m \u001b[0mexplanation\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3627\u001b[0m         \"\"\"\n\u001b[0;32m-> 3628\u001b[0;31m         \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3629\u001b[0m         \u001b[0;31m# Maybe set copy if we didn't actually change the index.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3630\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mequals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(self, indices, axis, is_copy, **kwargs)\u001b[0m\n\u001b[1;32m   3614\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3615\u001b[0m         new_data = self._mgr.take(\n\u001b[0;32m-> 3616\u001b[0;31m             \u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_block_manager_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverify\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3617\u001b[0m         )\n\u001b[1;32m   3618\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_constructor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__finalize__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"take\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(self, indexer, axis, verify)\u001b[0m\n\u001b[1;32m    859\u001b[0m         )\n\u001b[1;32m    860\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 861\u001b[0;31m         \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    862\u001b[0m         \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmaybe_convert_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverify\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverify\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    863\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/internals/base.py\u001b[0m in \u001b[0;36mshape\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     42\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mShape\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 43\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0max\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mfinal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/internals/base.py\u001b[0m in \u001b[0;36m<genexpr>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     42\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mShape\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 43\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0max\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mfinal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/TradeMaster/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36m__len__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    792\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    793\u001b[0m     \u001b[0;31m# ndarray compat\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 794\u001b[0;31m     \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    795\u001b[0m         \"\"\"\n\u001b[1;32m    796\u001b[0m         \u001b[0mReturn\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mlength\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "from agent.EIIE.trader import trader\n",
    "from agent.EIIE.util import *\n",
    "from env.PM.portfolio_for_EIIE import Tradingenv\n",
    "from agent.EIIE.model import EIIE_con, EIIE_lstm, EIIE_rnn, EIIE_critirc\n",
    "parser = argparse.ArgumentParser()\n",
    "parser.add_argument(\"--random_seed\",\n",
    "                    type=int,\n",
    "                    default=12345,\n",
    "                    help=\"the path for storing the downloaded data\")\n",
    "parser.add_argument(\n",
    "    \"--env_config_path\",\n",
    "    type=str,\n",
    "    default=\"config/input_config/env/portfolio/portfolio_for_EIIE/\",\n",
    "    help=\"the path for storing the downloaded data\")\n",
    "parser.add_argument(\n",
    "    \"--net_type\",\n",
    "    choices=[\"conv\", \"lstm\", \"rnn\"],\n",
    "    default=\"conv\",\n",
    "    help=\"the name of the model\",\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--num_hidden_nodes\",\n",
    "    type=int,\n",
    "    default=32,\n",
    "    help=\"the number of hidden nodes in lstm or rnn\",\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--num_out_channel\",\n",
    "    type=int,\n",
    "    default=2,\n",
    "    help=\"the number of channel\",\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--gamma\",\n",
    "    type=float,\n",
    "    default=0.99,\n",
    "    help=\"the gamma for DPG\",\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--model_path\",\n",
    "    type=str,\n",
    "    default=\"result/PM/EIIE/trained_model\",\n",
    "    help=\"the path for trained model\",\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--result_path\",\n",
    "    type=str,\n",
    "    default=\"result/PM/EIIE/test_result\",\n",
    "    help=\"the path for test result\",\n",
    ")\n",
    "parser.add_argument(\n",
    "    \"--num_epoch\",\n",
    "    type=int,\n",
    "    default=2,\n",
    "    help=\"the number of epoch we train\",\n",
    ")\n",
    "args = parser.parse_args(args=[])\n",
    "with torch.autograd.set_detect_anomaly(True):\n",
    "    a = trader(args)\n",
    "    a.train_with_valid()\n",
    "    a.test()\n",
    "clear_output(wait=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Test Visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>daily_return</th>\n",
       "      <th>total assets</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.003422</td>\n",
       "      <td>100342.177295</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.007735</td>\n",
       "      <td>101118.368687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.000197</td>\n",
       "      <td>101098.406522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.007962</td>\n",
       "      <td>100293.477948</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   daily_return   total assets\n",
       "0      0.000000  100000.000000\n",
       "1      0.003422  100342.177295\n",
       "2      0.007735  101118.368687\n",
       "3     -0.000197  101098.406522\n",
       "4     -0.007962  100293.477948"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "test_result=pd.read_csv(\"result/PM/EIIE/test_result/result.csv\",index_col=0)\n",
    "test_result.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "x = range(len(test_result))\n",
    "y = test_result[\"total assets\"].tolist()\n",
    "plt.plot(x, y)  \n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7.13 ('TradeMaster')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.13"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "a1f97403911abd3f02553c8f2b0c54537fddc7efadd9f5d3e31784db6e40c347"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
